package thread.create.methodABDiff;

/*
Thread thread = new MyThread(myRunnable);
thread.star();
上述代码运行的时候，会执行MyThread 的run()，还是myRunnalbe的run()呢？
实际运行结果告诉我们，会执行MyThread的run()方法，下面分析原因:

Thread类 其实也实现了runnable接口，他的run方法如下：
    @Override
    public void run() {
        if (target != null) {
            target.run();
        }
    }
其中的target即为 构造函数传入的myRunnable的对象；

也就是说，当执行到Thread类中的run()方法时，会首先判断target是否存在，存在则执行target中的run()方法，
也就是实现了Runnable接口并重写了run()方法的类中的run()方法。
但是上述给到的列子中，由于“多态” 的存在，根本就没有机会执行到Thread类中的run()方法，
而是直接先执行了运行时类型即MyThread类中的run()方法。

*/
public class ThreadTest {

    public static void main(String[] args) {
        for (int i = 0; i < 100; i++) {
            System.out.println(Thread.currentThread().getName() + " " + i);
            if (i == 30) {
                Runnable myRunnable = new MyRunnable();
                Thread thread = new MyThread(myRunnable);
                thread.start();
            }
        }
    }
}

class MyRunnable implements Runnable {
    private int i = 0;

    @Override
    public void run() {
        //System.out.println("in MyRunnable run");
        for (i = 0; i < 100; i++) {
            System.out.println("in MyRunnable run"+Thread.currentThread().getName() + " " + i);
        }
    }
}

class MyThread extends Thread {

    private int i = 0;
    
    public MyThread(Runnable runnable){
        super(runnable);
    }

    @Override
    public void run() {
       // System.out.println("in MyThread run");
        for (i = 0; i < 100; i++) {
            System.out.println("in MyThread run"+Thread.currentThread().getName() + " " + i);
        }
    }
}